this._targetScale = 0;
this._scale = 0;
this._expandFraction = 1;
+ this._updateStateId = 0;
this._pendingScaleUpdate = false;
- this._stateUpdateQueued = false;
this._animatingIndicator = false;
this._shouldShow = true;
this._thumbnails = [];
- Main.overview.connect('showing',
- this._createThumbnails.bind(this));
- Main.overview.connect('hidden',
- this._destroyThumbnails.bind(this));
-
- Main.overview.connect('item-drag-begin',
- this._onDragBegin.bind(this));
- Main.overview.connect('item-drag-end',
- this._onDragEnd.bind(this));
- Main.overview.connect('item-drag-cancelled',
- this._onDragCancelled.bind(this));
- Main.overview.connect('window-drag-begin',
- this._onDragBegin.bind(this));
- Main.overview.connect('window-drag-end',
- this._onDragEnd.bind(this));
- Main.overview.connect('window-drag-cancelled',
- this._onDragCancelled.bind(this));
+ this._overviewSignals = [
+ Main.overview.connect('showing',
+ () => this._createThumbnails()),
+ Main.overview.connect('hidden',
+ () => this._destroyThumbnails()),
+ Main.overview.connect('item-drag-begin',
+ () => this._onDragBegin()),
+ Main.overview.connect('item-drag-end',
+ () => this._onDragEnd()),
+ Main.overview.connect('item-drag-cancelled',
+ () => this._onDragCancelled()),
+ Main.overview.connect('window-drag-begin',
+ () => this._onDragBegin()),
+ Main.overview.connect('window-drag-end',
+ () => this._onDragEnd()),
+ Main.overview.connect('window-drag-cancelled',
+ () => this._onDragCancelled()),
+ ];
this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA });
this._settings.connect('changed::dynamic-workspaces',
() => this._updateShouldShow());
- Main.layoutManager.connect('monitors-changed', () => {
- this._destroyThumbnails();
- if (Main.overview.visible)
- this._createThumbnails();
- });
+ this._monitorsChangedId =
+ Main.layoutManager.connect('monitors-changed', () => {
+ this._destroyThumbnails();
+ if (Main.overview.visible)
+ this._createThumbnails();
+ });
- global.display.connect('workareas-changed',
- this._updatePorthole.bind(this));
+ this._workareasChangedId = global.display.connect('workareas-changed',
+ () => this._updatePorthole());
this.connect('notify::visible', () => {
if (!this.visible)
this._queueUpdateStates();
});
+ this.connect('destroy', () => this._onDestroy());
this._switchWorkspaceNotifyId = 0;
this._nWorkspacesNotifyId = 0;
this._syncStackingId = 0;
- this._workareasChangedId = 0;
this._scrollAdjustment = scrollAdjustment;
- this._scrollAdjustment.connect('notify::value', adj => {
- let workspaceManager = global.workspace_manager;
- let activeIndex = workspaceManager.get_active_workspace_index();
+ this._scrollValueId = this._scrollAdjustment.connect('notify::value',
+ adj => {
+ const { workspaceManager } = global;
+ const activeIndex = workspaceManager.get_active_workspace_index();
- this._animatingIndicator = adj.value !== activeIndex;
+ this._animatingIndicator = adj.value !== activeIndex;
- if (!this._animatingIndicator)
- this._queueUpdateStates();
+ if (!this._animatingIndicator)
+ this._queueUpdateStates();
- this.queue_relayout();
- });
+ this.queue_relayout();
+ });
+ }
+
+ _onDestroy() {
+ this._unqueueUpdateStates();
+
+ if (this._scrollValueId)
+ this._scrollAdjustment.disconnect(this._scrollValueId);
+ this._scrollValueId = 0;
+
+ if (this._monitorsChangedId)
+ Main.layoutManager.disconnect(this._monitorsChangedId);
+ this._monitorsChangedId = 0;
+
+ if (this._workareasChangedId)
+ global.display.disconnect(this._workareasChangedId);
+ this._workareasChangedId = 0;
+
+ this._overviewSignals.forEach(id => Main.overview.disconnect(id));
+ this._overviewSignals = [];
+
+ if (this._settings)
+ this._settings.run_dispose();
+ this._settings = null;
}
_updateShouldShow() {
this._targetScale = 0;
this._scale = 0;
this._pendingScaleUpdate = false;
- this._stateUpdateQueued = false;
+ this._unqueueUpdateStates();
this._stateCounts = {};
for (let key in ThumbnailState)
}
_updateStates() {
- this._stateUpdateQueued = false;
+ this._updateStateId = 0;
// If we are animating the indicator, wait
if (this._animatingIndicator)
}
_queueUpdateStates() {
- if (this._stateUpdateQueued)
+ if (this._updateStateId > 0)
return;
- Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
- this._updateStates.bind(this));
+ this._updateStateId = Meta.later_add(
+ Meta.LaterType.BEFORE_REDRAW, () => this._updateStates());
+ }
- this._stateUpdateQueued = true;
+ _unqueueUpdateStates() {
+ if (this._updateStateId)
+ Meta.later_remove(this._updateStateId);
+ this._updateStateId = 0;
}
vfunc_get_preferred_height(forWidth) {